import {
  Loading,
  Message
} from 'element-ui';
import {
  TCP_ERR_CODE as errors
} from './error'
const stack = [] // 请求堆栈;


/**
 * @description 向axios 实例中添加视觉效果
 * @param {Object} axios -要添加效果的axios实例
 * @returns 
 */
export default function AddProcess(axios) {
  axios.interceptors.request.use(setRequest, Promise.reject) //发起请求
  axios.interceptors.response.use(setResponse, setResponseReject) // 获取信息
  return axios;
}
/**  
 * @description 创建请求时操作
 * @param {Object} config 请求配置
 * @param {Object=} config.params GET请求参数
 * @returns {Object} config 处理后的请求配置
 */
function setRequest(config) {
  const params = config.params || {},
    _ = ~~(Math.random() * 10000);
  config.params = {
    _,
    ...params,
  };
  setLoading(config) //当忽略时 不用堆入栈内
  return config;
}
// 返回数据
function setResponse(res) {
  const
    data = res.data, //返回数据
    config = res.config, //配置
    isFile = config.responseType, //当前接口返回的文件流
    isNormal = !!data && data.code === '1'; // TODO 自行配置数据是否异常 
  setLoading(config) // 忽略load
  return (isFile || isNormal) ? data : setResponseReject(res, true)
}
// 返回错误
function setResponseReject(error, isMe = false) {
  let message;
  if (isMe) {
    const data = error.data;
    Message({
      type: 'error',
      message: data.msg || data.data
    });
    return Promise.reject(error)
  }
  const type = 'error',
    defaultErrMessage = '请求失败',
    code = error.code,
    response = error.response,
    config = response ? response.config : error.config,
    data = response ? response.data : null;
  if (data) message = data.message || defaultErrMessage
  else if (errors[code]) message = errors[code]
  else {
    message = defaultErrMessage;
  }
  Message({
    type,
    message
  });
  setLoading(config);
  return Promise.reject(data)
}
// 栈 操作
function setLoading(config) {
  const _ = config.params._,
    index = stack.indexOf(_),
    ignore = !!config.ignore;
  if (ignore) return //不操作蒙版
  else if (index === -1) stack.push(_) //添加 栈
  else stack.splice(index, 1) //移除 栈

  const mask = Loading.service({
    fullscreen: true,
    spinner: "fa fa-cog fa-spin fa-3x",
    text: config.title || ''
  })
  stack.length || mask.close() //栈为空时 关闭加载
}